/**
 * 传输完成事件接收函数
 * @param {Object} ret，返回的信息，格式如下
 * 			格式： <[OK] | [NO]>  <\r\n> [<ErrorDescription:> [errordes] <\r\n>]
 * 				[<ErrorNo:><LastErrorNo><\r\n>]
 * 					[<SuccessList:>[filepath1|filepath2] <\r\n>]
 * 					[<FailedList:>[filepath1|filepath2] <\r\n>]
 * 					[<ReadFileWaitTimes:> [XXX] <\r\n>] [<WriteSockWaitTimes:> [XXX] <\r\n>]
 * 					[<ThreadCostTimeByOpenfile:> [XXX] <\r\n>]
 * 					[<ThreadCostTimeByOpenfile:> [XXX] <\r\n>]
 * 					[<ThreadCostTimeByOpenfile:> [XXX] <\r\n>]
 * 					[<ThreadCostTimeByOpenfile:> [XXX] <\r\n>]
 * @param {Object} taskId ，任务号
 */
function GetTransEvent_OnPutHttpFileFinish(_ret, _taskId){
    try {
        OnPutHttpFileFinish(_ret, _taskId);
    } 
    catch (e) {
        alert("回调函数:OnPutHttpFileFinish 失败，请实现此函数，或者屏蔽此弹出消息");
    }
    
}

/**
 * 传输中间过程事件接收
 * @param {Object} nSendFileCount 已经发送的文件个数
 * @param {Object} nFileCount	  总共要发送的文件个数
 * @param {Object} SendLength	  已经发送的内容长度
 * @param {Object} ContentLength  总共需要发送的内容长度
 * @param {Object} nInstanceId	  任务号
 */
function GetTransEvent_OnPutHttpFileTrans(_nSendFileCount, _nFileCount, _SendLength, _ContentLength, _taskId){
    try {
        OnPutHttpFileTrans(_nSendFileCount, _nFileCount, _SendLength, _ContentLength, _taskId);
    } 
    catch (e) {
        alert("回调函数:OnPutHttpFileTrans 失败，请实现此函数，或者屏蔽此弹出消息");
    }
}

function YYTrans(name){
    this._name = "Trans01";
    if (typeof(pname) != "undefined") {
        this._name = pname;
    }
    this._classid = "42230A6B-6C7E-4C21-9C0D-ABEE72BCCA16";
    this._codebase = "/scan/NKTrans.CAB";
    this._version = "1,0,0,56";
   // alert(this._name);
    this.obj = function(){
        return document.getElementById(this._name);
    }
}
/**
 * 初始化控件，需要放在BODY里面
 * @param {Object} width  控件宽度
 * @param {Object} height 控件高度
 */
YYTrans.prototype.initTrans = function(width,height){
    document.write("<OBJECT ");
    document.write("ID='" + this._name + "' WIDTH='"+width+"' HEIGHT='"+height+"' ");
    document.write("CLASSID='CLSID:" + this._classid + "' ");
    document.write("CODEBASE='" + this._codebase + "#version=" + this._version + "'>");
    document.write("</OBJECT>");
    
    //绑定事件 -- 传输完成
    document.write("<SCRIPT FOR='" + this._name + "' EVENT='OnPutHttpFileFinish(ret,id)'>");
    document.write("GetTransEvent_OnPutHttpFileFinish(ret,id);");
    document.write("</SCRIPT>");
    
    //绑定事件 -- 传输事件接收
    document.write("<SCRIPT FOR='" + this._name + "' EVENT='OnPutHttpFileTrans(nSendFileCount, nFileCount, SendLength, ContentLength, nInstanceId)'>");
    document.write("GetTransEvent_OnPutHttpFileTrans(nSendFileCount, nFileCount, SendLength, ContentLength, nInstanceId);");
    document.write("</SCRIPT>");
}
/**
 * 上传文件或者目录
 * @param {Object} szHost 	主机地址
 * @param {Object} nPort	主机端口
 * @param {Object} szUrl	远程路经  a/b/c
 * @param {Object} szPath	本地路径	本地文件路径,一次只支持一个目录
 * 							 格式形如：c:/abc/*.JPG|*.TIF|0001.vss
 * @param {Object} nFlag	控制参数，可以是参数的一个或者多个，
 * 							1 显示传输进度 2 页面接收传输进度事件 4 后台传输,还未真正分开
 * @return {Object} taskId 返回任务号
 */
YYTrans.prototype.PutFile = function(szHost, nPort, szUrl, szPath, nFlag){
    return this.obj().PutHttpFile(szHost, nPort, szUrl, szPath, nFlag);
}
/**
 * 关于对话框
 */
YYTrans.prototype.AboutBox = function(){
    this.obj().AboutBox();
}

/**
 * 终止传输
 * @param {Object} taskId 任务号
 */
YYTrans.prototype.EndTrans = function(taskId){
    this.obj().EndTrans(taskId);
}

/**
 * 解析返回结构的辅助类
 * @param {Object} _szResult
 */
function ResultWrapper(_szResult){
    this.szResult = _szResult;
}

/**
 * 传送文件是否成功
 */
ResultWrapper.prototype.isOK = function(){
    if (this.szResult.substring(0, 2) == "OK") {
        return true;
    }
    else {
        return false;
    }
}

ResultWrapper.prototype.getFieldvalueByName = function(fieldName){
    try {
        var startRetPos = this.szResult.indexOf(fieldName + ":");
        if (startRetPos == -1) {
            return "无";
        }
        var endRetPos = this.szResult.indexOf("\r\n", startRetPos);
        return this.szResult.substring(startRetPos + (fieldName + ":").length, endRetPos);
    } 
    catch (e) {
        alert("解析返回结果出现异常：" + e)
        return "";
    }
}

/**
 * 获得传输的文件数目
 */
ResultWrapper.prototype.getTransFileCount = function(){
    return this.getFieldvalueByName("FileCount");
}

/**
 * 获得传输的文件数目
 */ 
ResultWrapper.prototype.getErrorDescription = function(){ 
    return this.getFieldvalueByName("ErrorDescription");
}

/**
 * 获得传输速度
 */
ResultWrapper.prototype.getTransSpeed = function(){
    if (this.isOK()) {
        try {
            var FileCount = parseInt(this.getFieldvalueByName("FileCount"));
            var TransLength = parseInt(this.getFieldvalueByName("TransLength"));
            var FileTotalLength = parseInt(this.getFieldvalueByName("FileTotalLength"));
            var TransCostTime = parseInt(this.getFieldvalueByName("TransCostTime"));
            var szRet = (FileCount * 1000 / TransCostTime).toFixed(3) + "个/秒";
            if (TransLength / TransCostTime > 1024) {
                szRet = szRet + " 传输速率：" + (TransLength / TransCostTime / 1024 * 1000 / 1024).toFixed(3) + "MB/S";
                szRet = szRet + " 有效传输速率：" + (FileTotalLength / TransCostTime / 1024 * 1000 / 1024).toFixed(3) + "MB/S";
            }
            else {
                szRet = szRet + " 传输速率：" + (TransLength / TransCostTime / 1024).toFixed(2) + "KB/S";
                szRet = szRet + " 有效传输速率：" + (FileTotalLength / TransCostTime / 1024).toFixed(2) + "KB/S";
            }
            return szRet;
        } 
        catch (e) {
            return "未知，由于处理返回结果数据出错,错误原因：" + e;
        }
    }
    else {
        return "未知，由于失败的传输";
    }
}

/**
 * 获得传输成功的短文件名称列表
 */
ResultWrapper.prototype.getSuccessFilelist = function(){
    return this.getFieldvalueByName("SuccessList");
}

/**
 * 获得传输失败的短文件名称列表
 */
ResultWrapper.prototype.getFailedFilelist = function(){
    return this.getFieldvalueByName("FailedList");
}

ResultWrapper.prototype.getAdvice = function(){
    try {
        if (this.isOK()) {
            var ReadBufferWaitTimes = parseInt(this.getFieldvalueByName("ReadBufferWaitTimes"));
            var WriteBufferWaitTimes = parseInt(this.getFieldvalueByName("WriteBufferWaitTimes"));
            if (ReadBufferWaitTimes < 4 && WriteBufferWaitTimes < 4) {
                return "需要整体提高计算机的响应速度，包括网络，可以加快传输速度";
            }
            else 
                if (ReadBufferWaitTimes > WriteBufferWaitTimes) {
                    return "硬盘读写速度成为了传输的瓶颈，可以通过提高硬盘读写速度加快传输";
                }
                else {
                    return "网络带宽成为了传输的瓶颈，可以通过增加带宽提高速度"
                }
        }
        else {
            return "无任何建议，由于失败的传输";
        }
    } 
    catch (e) {
        return "无任何建议，处理返回结果数据出错,出错原因：" + e;
    }
}

